#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cctype>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <set> 
#include <algorithm> 
#include <map>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef long long unsigned ull;
typedef unsigned uint;

template <class T> inline T sqr(T x) { return x * x; }
template <class T> inline void updMin(T& a, const T& b) { if (b < a) a = b; }
template <class T> inline void updMax(T& a, const T& b) { if (b > a) a = b; }

const int maxn = 2000 + 100;
const int maxm = 200000 + 100;

int boyStart[maxn];
int girlStart[maxn];
int boyNext[maxm];
int girlNext[maxm];

int boyTo[maxm];
int girlTo[maxm];

int eSize = 0;

int frG[maxn];
int frB[maxn];

int ITER;

bool d[maxn][maxn];
int vis[maxn];
bool can[maxn][maxn];
int glId;

void dfs1(int girlId)
{
	vis[girlId] = ITER;
	can[glId][girlId] = true;
	int boyId = frG[girlId];
	for (int j = boyStart[boyId]; j != -1; j = boyNext[j]) {
		int gt = boyTo[j];
		if (gt == girlId) { // matching edge
			continue;
		} else {
			if (vis[gt] != ITER) {
				dfs1(gt);
			}
		}
	}
}

int main()
{
	//freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
	//freopen("input2.txt", "r", stdin); freopen("output.txt", "w", stdout);

	int n;
	scanf("%d", &n);
	//n = 2000; 
	
	memset(boyStart, -1, sizeof(boyStart));
	memset(girlStart, -1, sizeof(girlStart));

	for (int i = 0; i < n; ++i)
	{
		int k;
		scanf("%d", &k);
		for (int j = 0; j < k; ++j)
		{
			int to;
			scanf("%d", &to);
			--to;

			boyNext[eSize] = boyStart[i];
			boyStart[i] = eSize;
			boyTo[eSize] = to;

			girlNext[eSize] = girlStart[to];
			girlStart[to] = eSize;
			girlTo[eSize] = i;

			++eSize;
		}
	}

	
	for (int i = 0; i < n; ++i)
	{
		int girl;
		scanf("%d", &girl);
		--girl;
		frB[i] = girl; 
		frG[girl] = i;
	}

	for (int i = 0; i < n; ++i) { // calc can from girl i
		++ITER;
		glId = i;
		dfs1(i);
	}

	for (int i = 0; i < n; ++i) { // get answer for boy i
		int finish = frB[i];
		int l = 0;
		for (int j = boyStart[i]; j != -1; j = boyNext[j]) {
			int gId = boyTo[j];
			l += can[gId][finish];
		}
		printf("%d ", l);
		for (int j = boyStart[i]; j != -1; j = boyNext[j])
		{
			int girl = boyTo[j];
			if (can[girl][finish])
				printf("%d ", girl + 1);
		}
		puts("");
	}

	/*for (int i = 0; i < n; ++i)
	{
		int l = 0;
		for (int j = 0; j < n; ++j)
			l += int(d[i][j]);
		printf("%d ", l);
		for (int j = boyStart[i]; j != -1; j = boyNext[j])
		{
			int girl = boyTo[j];
			if (d[i][girl])
				printf("%d ", girl + 1);
		}
		puts("");
	}*/

	//cerr << fixed << setprecision(2) << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
	return 0;
}